# -*- coding:utf-8 -*-

import time
import os
import random
import codecs



class Storage:
    '''
    代码或链接等资源的存储操作
    '''
    coding = 'utf-8'
    code = 0 #信息编号
    msg = '' #信息说明

    fileName = '' #需要写入的文件路径
    saveDir = {'result':'result','reserved':'reserved'} #保存的目录result 最终采集目标存放地点，reserved 预采集资源呢链接存放地点
    fileDir = '' #文件存放目录
    isMkFile = True #是否需要创建文件，False 将追加
    path = "" #当前项目包的绝对路径


    def __init__(self):
        '''
        初始化
        :return:
        '''
        #当前项目目录
        self.path = os.path.abspath(os.path.dirname(os.getcwd()))


    def save(self,content,title='',extention = '',saveDir = 'result'):
        '''
        :param content: 需要保存的数据
        :param title: 保存的文件名
        :param extention: 保存的文件后缀
        :return: bool
        '''
        if content == '':
            return False
        #print('title',title)
        if title == '':
            # 当标题为空时，生成一个以日期时间为名的文件名,为了文件唯一，再加上随机
            title = time.strftime("%Y%m%d%H%M%S",time.localtime())
            randNum = random.randrange(100,999)
            title = "%s%s"%(title,randNum)

        #需要保存的目录
        if saveDir == 'result':
            self.fileDir = "%s%s%s"%(self.saveDir[saveDir],'/',extention)
        else:
            self.fileDir = "%s"%(self.saveDir[saveDir])
        #检测是否存在目录，不存在则创建
        path = self.__mkDir()
        #创建文件

        self.fileName = "%s%s%s%s%s"%(path,'/',title,'.',extention)
        #self.__mkFile(self.fileName)

        content = self.__checkHas(content)
        #存储
        self.__doSave(content)
        return True

    def __doSave(self,content):
        '''
        保存操作 由于windows下不支持os.mknod() 创建文件，此处用file
        :param content: 保存类容
        :return:
        '''
        #f = os.open(self.fileName,os.O_WRONLY)
        #os.write(f, content)
        #os.close(f)
        f = codecs.open(self.fileName,'a',self.coding) #由于需要单独写入一个文件的会生成一个新文件，所以，此处用追加

        if isinstance(content,list):
            '''
            f.write('['+'\n')
            for ele in content:
                f.write('   "'+ele+'"'+'\n')
            f.write(']'+'\n')
            '''
            for ele in content:
                f.write(''+ele+''+'\n')
        else:
            f.write(content+'\n')
        f.close()

    def __mkDir(self):
        '''
        检测是否存在保存目录，不存在则创建
        '''
        #当前项目目录
        path = self.path
        # 保存总目录是否存在
        path = "%s%s%s"%(path,'/',self.fileDir)
        if os.path.exists(path) is False:
            os.makedirs(path)
        return path

    def __mkFile(self,fileName):
        if self.isMkFile:
            os.mknod(fileName)

    def __checkHas(self,data):
        '''
        检测是否存在重复的文件名，存在-去重
        '''

        path = self.path+'/'+self.saveDir['reserved']+'/'+self.saveDir['reserved']+'.txt'
        if os.path.exists(path) and isinstance(data,list) :
            f = codecs.open(path,'r',self.coding)
            content = f.read()
            #print(content)

            if content != '' or content is not None :
                '''
                for index,item in enumerate(data):
                    if content.find(item):
                        del data[index]
                '''
                contentList = content.split('\n')
                #print(contentList)
                data = list(set(data)-set(contentList))
                #data = contentList + data
                #data = list(set(data)) # 去重
                data = [i for i in data if i != '']#去空元素
            f.close()

        return data


